package br.com.arg.aplica.controller;

import java.util.List;

import javax.ejb.Stateful;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;

import br.com.arg.aplica.data.CodigoGeraProducer;
import br.com.arg.aplica.model.Codigo;
import br.com.arg.aplica.model.CodigoModelo;

@Stateful
//The @Model stereotype is a convenience mechanism to make this a
//request-scoped bean that has an
//EL name
//Read more about the @Model stereotype in this FAQ:
//http://sfwk.org/Documentation/WhatIsThePurposeOfTheModelAnnotation
@Named 
@SessionScoped 
public class CodigoRegistration {
	@Inject
	private FacesContext facesContext;

	@Inject
	private EntityManager em;

	@Inject
	private List<CodigoModelo> codigoModelos;

	@Inject
	private CodigoGeraProducer cgp;

	private String linhasDeCodigo;

	public String getLinhasDeCodigo() {
		return linhasDeCodigo;
	}

	public void setLinhasDeCodigo(String linhasDeCodigo) {
		this.linhasDeCodigo = linhasDeCodigo;
	}

	private String stringListCMs;

	public String getStringListCMs() {
		stringListCMs = "";
		String sql = "select cm.linha from CodigoModelo cm where cm.nome='" + idModelo2Buscar 
				+ "' order by cm.sequencia";
		for (String s : em.createQuery(sql, String.class).getResultList()) {
			stringListCMs += s;
		}

		System.out.println("Lista de Codigo modelos recuperados size=" + stringListCMs.length());
		return stringListCMs;
	}

	public void setStringListCMs(String stringListCMs) {
		this.stringListCMs = stringListCMs;
	}

	private String idModelo2Buscar;

	public String getIdModelo2Buscar() {
		return idModelo2Buscar;
	}

	public void setIdModelo2Buscar(String idModelo2Buscar) {
		this.idModelo2Buscar = idModelo2Buscar;
	}

	private String idModelo;

	public String getIdModelo() {
		return idModelo;
	}

	public void setIdModelo(String idModelo) {
		this.idModelo = idModelo;
	}

	private String codigoFormato;

	public String getCodigoFormato() {
		return codigoFormato;
	}

	public void setCodigoFormato(String codigoFormato) {
		this.codigoFormato = codigoFormato;
	}

	private CodigoModelo codigoModelo;

	public CodigoModelo getCodigoModelo() {
		return codigoModelo;
	}

	private Codigo codigo;

	public Codigo getCodigo() {
		return codigo;
	}

	public String geraListaCodigoMedelo() {
		linhasDeCodigo = getStringListCMs();
		idModelo = idModelo2Buscar;
		
		return null;
	}

	public String geraCodigo() {
		linhasDeCodigo = "";

		for (String s : cgp.geraListaCodigo(codigoFormato, idModelo2Buscar)) {
			codigo = new Codigo();
			codigo.setNome(idModelo);
			codigo.setLinha(s);
			em.persist(codigo);
			linhasDeCodigo += s;
		}

		if (linhasDeCodigo != "") {
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Código gerado com sucesso! size="
					+ linhasDeCodigo.length(), "Código gerado com sucesso"));

		}
		
		return null;		
	}

	public void removeAll() {
		for (CodigoModelo cm : codigoModelos) {
			if (cm.getNome().equals(idModelo)) {
				CodigoModelo codmod = em.find(CodigoModelo.class, cm.getSequencia());
				em.remove(codmod);
			}
		}
	}

	public String register() throws Exception {
		System.out.println("Código a remover " + idModelo);
		if (idModelo == "") {
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Id modelo inválido - não registrado!", "Registration successful"));
			return null;
		}

		removeAll();

		String[] lines = linhasDeCodigo.toString().split("\n");

		for (String s : lines) {
			if (s.length() != 0) {
				codigoModelo = new CodigoModelo();
				codigoModelo.setNome(idModelo);
				codigoModelo.setLinha(s);
				em.persist(codigoModelo);
			}
		}

		return null;
	}
}
